Flatten

将多维输入张量按行优先(row-major)顺序展平成一维连续数组。 该算子仅改变数据的形状,不改变数据内容与顺序,本质上是一次连续内存拷贝操作。

数学上可表示为:

\[\text{output} = \text{reshape}(\text{input}, [-1])\]

输入张量的所有元素按照原有存储顺序依次写入输出张量。

输入:
  • input - 输入数据地址。

  • core_mask - 核掩码(仅适用于共享存储版本)。

  • param - Flatten 参数结构体指针,包含形状与类型信息。

输出:
  • output - 展平后的输出数据地址。

FlattenParameter 结构体说明:

  • shape_ - 输入张量各维度大小数组。

  • ndim_ - 输入张量维度数。

  • elem_cnt_ - 输入张量元素总数。

  • type_size_ - 单个元素的字节数。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 fp32fp64int8int16int32cplx64cplx128

  • MT7004 支持 fp16fp32int16int32cplx64

  • 该算子不涉及数值计算,仅进行内存搬运

  • 当 input 与 output 地址相同时,算子直接返回,不执行拷贝

  • 当 core_mask 对应的逻辑核无效时,算子直接返回

共享存储版本:

void Flatten(const void *input, void *output, int core_mask, FlattenParameter *param)

C调用示例:

 1// FT78NE 示例(共享存储)
 2#include <stdio.h>
 3#include <flatten.h>
 4
 5int main(int argc, char* argv[]) {
 6    float *input  = (float *)0xA0000000;   // DDR 空间
 7    float *output = (float *)0xC0000000;
 8
 9    int shape[3] = {1, 3, 224 * 224};
10
11    FlattenParameter param;
12    param.shape_ = shape;
13    param.ndim_ = 3;
14    param.elem_cnt_ = 1 * 3 * 224 * 224;
15    param.type_size_ = sizeof(float);
16
17    int core_mask = 0xff;
18    Flatten(input, output, core_mask, &param);
19
20    return 0;
21}

私有存储版本:

该算子在私有存储模式下等价为单核内存拷贝操作, 直接调用 Flatten 且 core_mask 设置为单核即可。

C调用示例:

 1// FT78NE 示例(私有存储)
 2#include <stdio.h>
 3#include <flatten.h>
 4
 5int main(int argc, char* argv[]) {
 6    float *input  = (float *)0x10810000;   // L2 空间
 7    float *output = (float *)0x10820000;
 8
 9    int shape[2] = {4, 256};
10
11    FlattenParameter param;
12    param.shape_ = shape;
13    param.ndim_ = 2;
14    param.elem_cnt_ = 4 * 256;
15    param.type_size_ = sizeof(float);
16
17    Flatten(input, output, 0x1, &param);
18
19    return 0;
20}